{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python2.7/dist-packages/sklearn/cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n",
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import scipy.stats as stats\n",
    "import seaborn as sns\n",
    "from sklearn import preprocessing\n",
    "from sklearn.cross_validation import train_test_split\n",
    "\n",
    "%matplotlib inline\n",
    "pd.set_option(\"display.max_colwidth\",100)\n",
    "sns.set(style=\"ticks\", color_codes=True)\n",
    "def plot_data(data, x, y, x_title='x', y_title='y', xlim=None, ylim=None, size=4, alpha=0.02):\n",
    "    slope, intercept, r_value, p_value, std_err = stats.linregress(data[x],data[y])\n",
    "    print '# of UTRs = ', len(data)\n",
    "    print 'r-squared = ',r_value**2\n",
    "\n",
    "    sns.set(style=\"ticks\", color_codes=True)\n",
    "    g = sns.JointGrid(data=data, x=x, y=y, xlim=xlim, ylim=ylim, size=size)\n",
    "    g = g.plot_joint(plt.scatter, color='#e01145', edgecolor=\"black\", alpha=alpha)\n",
    "    f = g.fig\n",
    "    f.text(x=0, y=0, s='r2 = {}'.format(round(r_value**2, 3)))\n",
    "    g = g.plot_marginals(sns.distplot, kde=False, color='#e01145')\n",
    "    g = g.set_axis_labels(x_title, y_title)\n",
    "    \n",
    "def vectorizeSequence(seq):\n",
    "    # the order of the letters is not arbitrary.\n",
    "    # Flip the matrix up-down and left-right for reverse compliment\n",
    "    ltrdict = {'a':[1,0,0,0],'c':[0,1,0,0],'g':[0,0,1,0],'t':[0,0,0,1], 'n':[0,0,0,0]}\n",
    "    return np.array([ltrdict[x] for x in seq])\n",
    "\n",
    "import keras\n",
    "np.random.seed(1337)\n",
    "\n",
    "from keras.preprocessing import sequence\n",
    "from keras.optimizers import RMSprop\n",
    "from keras.models import Sequential\n",
    "from keras.layers.core import Dense\n",
    "from keras.layers.core import Dropout\n",
    "from keras.layers.core import Activation\n",
    "from keras.layers.core import Flatten\n",
    "from keras.layers.convolutional import Convolution1D, MaxPooling1D\n",
    "from keras.constraints import maxnorm\n",
    "from keras.callbacks import ModelCheckpoint, EarlyStopping\n",
    "\n",
    "def test_data(df, model, test_seq, obs_col, output_col='pred'):\n",
    "    scaler = preprocessing.StandardScaler()\n",
    "    scaler.fit(df[obs_col].reshape(-1,1))\n",
    "    #df.loc[:,'obs_stab'] = test_df['stab_df']\n",
    "    predictions = model.predict(test_seq).reshape(-1)\n",
    "    df.loc[:,output_col] = scaler.inverse_transform(predictions)\n",
    "    return df\n",
    "\n",
    "def binarize_sequences(df, col='utr', seq_len=54):\n",
    "    vector=np.empty([len(df),seq_len,4])\n",
    "    for i,seq in enumerate(df[col].str[:seq_len]):\n",
    "        vector[i]=vectorizeSequence(seq.lower())\n",
    "    return vector"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Load data to get MRL values for scaling - convert the scaled predictions of the evolved sequences to MRL"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "StandardScaler(copy=True, with_mean=True, with_std=True)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv('../data/egfp_unmod_1.csv')\n",
    "df.sort_values('total_reads', ascending=False).reset_index(drop=True)\n",
    "\n",
    "# Select a number of UTRs for the purpose of scaling.\n",
    "scale_utrs = df[:40000]\n",
    "\n",
    "# Scale\n",
    "scaler = preprocessing.StandardScaler()\n",
    "scaler.fit(scale_utrs['rl'].reshape(-1,1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Choose model to use for evolving new sequences.\n",
    "In the paper, the model used for evolving sequences is saved here as \"evolution_model.hdf5\". This is an older model that predates the main egfp model used in the paper (trained on unmodified EGFP replicate #1). The main model used in the paper is labeled \"main_MRL_model.hdf5\". Both retrained models are also available."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from keras.models import load_model\n",
    "# model = load_model('../modeling/saved_models/evolution_model.hdf5')\n",
    "# model = load_model('../modeling/saved_models/retrained_evolution_model.hdf5')\n",
    "# model = load_model('../modeling/saved_models/main_MRL_model.hdf5')\n",
    "model = load_model('../modeling/saved_models/retrained_main_MRL_model.hdf5')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Genetic algorithm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random\n",
    "import math\n",
    "\n",
    "def ret_rand_nuc():\n",
    "    x = random.randint(0,3)\n",
    "    if x == 0:\n",
    "        return [1,0,0,0] # A\n",
    "    if x == 1:\n",
    "        return [0,1,0,0] # C\n",
    "    if x == 2:\n",
    "        return [0,0,1,0] # G\n",
    "    if x == 3:\n",
    "        return [0,0,0,1] # T\n",
    "    \n",
    "def vector_to_nuc(arr, seq_len=50):\n",
    "    seq = ''\n",
    "    for i in range(seq_len):\n",
    "        if arr[i,0] == 1:\n",
    "            seq = seq + 'A'\n",
    "        if arr[i,1] == 1:\n",
    "            seq = seq + 'C'\n",
    "        if arr[i,2] == 1:\n",
    "            seq = seq + 'G'\n",
    "        if arr[i,3] == 1:\n",
    "            seq = seq + 'T'\n",
    "    return seq\n",
    "\n",
    "def convert_and_save(sequences, predictions):\n",
    "    # Convert the one-hot encoded sequences to A, C, T, G\n",
    "    seqs = []\n",
    "    for nbr in xrange(len(sequences)):\n",
    "        seqs.append(vector_to_nuc(sequences[nbr]))\n",
    "    df = pd.DataFrame(data=[seqs,predictions.tolist()]).transpose()\n",
    "    df.columns = ['utr', 'prediction']\n",
    "    df.sort_values('prediction', ascending=False, inplace=True)\n",
    "    return df\n",
    "\n",
    "def make_random_sequences(nbr_sequences, length, constant='', no_uaug=False, no_stop=False):\n",
    "    # Make randomize sequences, allowing for the inclusion / exclusion of uATGs / stop codons\n",
    "    seqs = []\n",
    "    nucs = {0:'A', 1:'T', 2:'C', 3:'G'}\n",
    "    i = 0\n",
    "    while i < nbr_sequences:\n",
    "        new_seq = ''\n",
    "        for n in range(length - len(constant)):\n",
    "            new_seq = new_seq + nucs[random.randint(0,3)]\n",
    "        \n",
    "        if no_uaug == False or (no_uaug==True and 'ATG' not in new_seq):\n",
    "            if no_stop == False or (no_stop == True and ('TAG' not in new_seq and 'TGA' not in new_seq and 'TAA' not in new_seq)):\n",
    "                new_seq = new_seq + constant\n",
    "                seqs.append(new_seq)\n",
    "                i+=1\n",
    "    return seqs\n",
    "\n",
    "def simple_mutate(seq, nbr_bases=1, prob=1):\n",
    "    if nbr_bases > 1 and prob > random.random():\n",
    "        nbr_bases = nbr_bases\n",
    "    else:\n",
    "        nbr_bases = 1\n",
    "    for i in range(nbr_bases):\n",
    "        pos = random.randint(0, 49)\n",
    "        seq[pos] = ret_rand_nuc()\n",
    "    return seq\n",
    "\n",
    "def check_for_uaug(seq):\n",
    "    seq = vector_to_nuc(seq)\n",
    "    return 'ATG' in seq[:50]\n",
    "\n",
    "def check_for_stops(seq):\n",
    "    seq = vector_to_nuc(seq)\n",
    "    if 'TAG' in seq[:50] or 'TGA' in seq[:50] or 'TAA' in seq[:50]:\n",
    "        return True\n",
    "    return False\n",
    "\n",
    "def negative_selection(seq, model, scaler, target_val, no_uaug=False, no_stop=False, nbr_bases_to_mutate=1, multi_mutate_prob=1, seq_len=50):\n",
    "    seqs = np.empty([2,seq_len,4])\n",
    "    seqs[0] = seq.copy()\n",
    "    seqs[1] = simple_mutate(seq.copy(), nbr_bases=nbr_bases_to_mutate, prob=multi_mutate_prob)\n",
    "    \n",
    "    if no_uaug == True and check_for_uaug(seqs[1]):\n",
    "        return seqs[0]\n",
    "    if no_stop == True and check_for_stops(seqs[1]):\n",
    "        return seqs[0]\n",
    "    \n",
    "    scores = model.predict(seqs).reshape(-1)\n",
    "    scores = scaler.inverse_transform(scores)\n",
    "    if scores[1] < scores[0]:\n",
    "        if scores[1] >= target_val:\n",
    "            return seqs[1]\n",
    "        else:\n",
    "            return seqs[0]\n",
    "    else:\n",
    "        return seqs[0]    \n",
    "\n",
    "def selection(seq, model, scaler, target_val, no_uaug=False, no_stop=False, nbr_bases_to_mutate=1, multi_mutate_prob=1, seq_len=50):\n",
    "    seqs = np.empty([2, seq_len, 4])\n",
    "    seqs[0] = seq.copy()\n",
    "    seqs[1] = simple_mutate(seq.copy(), nbr_bases=nbr_bases_to_mutate, prob=multi_mutate_prob)\n",
    "    \n",
    "    if no_uaug == True and check_for_uaug(seqs[1]):\n",
    "        return seqs[0]\n",
    "    if no_stop == True and check_for_stops(seqs[1]):\n",
    "        return seqs[0]\n",
    "    \n",
    "    scores = model.predict(seqs).reshape(-1)\n",
    "    scores = scaler.inverse_transform(scores)\n",
    "    if scores[1] > scores[0]:\n",
    "        if scores[1] <= target_val:\n",
    "            return seqs[1]\n",
    "        else:\n",
    "            return seqs[0]\n",
    "    else:\n",
    "        return seqs[0]    \n",
    "    \n",
    "def selection_to_target(seq, model, scaler, target_val, no_uaug=False, no_stop=False, nbr_bases_to_mutate=1, multi_mutate_prob=1, seq_len=50, accept_range=0.1):\n",
    "    seqs = np.empty([2,seq_len,4])\n",
    "    # Save the incoming sequence before mutating\n",
    "    seqs[0] = seq.copy()\n",
    "    # The mutated sequence\n",
    "    seqs[1] = simple_mutate(seq.copy(), nbr_bases=nbr_bases_to_mutate, prob=multi_mutate_prob)\n",
    "    \n",
    "    # Decide whether to continue with the new sequence based on the uAUG / stop codon preference\n",
    "    if no_uaug == True and check_for_uaug(seqs[1]):\n",
    "        return seqs[0]\n",
    "    if no_stop == True and check_for_stops(seqs[1]):\n",
    "        return seqs[0]\n",
    "    \n",
    "    scores = model.predict(seqs).reshape(-1)\n",
    "    scores = scaler.inverse_transform(scores)\n",
    "    \n",
    "    # Accept sequences that fall within this range. May provide more sequence diversity\n",
    "    if scores[0] >= target_val - accept_range and scores[0] <= target_val + accept_range:\n",
    "        return seqs[0]\n",
    "    else:\n",
    "        if abs(target_val - scores[1]) <= abs(target_val - scores[0]):\n",
    "            return seqs[1]\n",
    "        else:\n",
    "            return seqs[0]    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "_____"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Evolve new sequences - random to worst to best"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 100\n"
     ]
    }
   ],
   "source": [
    "# Dictionary where new sequences are saved\n",
    "evolved_seqs = {}\n",
    "# Number of evolution iterations\n",
    "iterations = 100\n",
    "# Number of bases to mutate if the probability to 'multi-mutate' is exceeded\n",
    "nbr_bases_to_mutate = 2\n",
    "# Probability to change multiple bases in an iteration\n",
    "prob_of_multi_mutation = 0.5\n",
    "# If using the original evolution model, set seq_len to 54. That model was\n",
    "# trained on UTRs that included the first for basees of the CDS (ATGG).\n",
    "seq_len = 50\n",
    "# Choose whether or not to allow uAUGs and / or stop codons\n",
    "no_uaug = True\n",
    "no_stop = False\n",
    "\n",
    "nbr_sequences = 5\n",
    "rand_seqs = make_random_sequences(nbr_sequences, seq_len, no_uaug=True, no_stop=True)\n",
    "e_seqs = np.empty([len(rand_seqs), seq_len, 4])\n",
    "\n",
    "i = 0\n",
    "for seq in rand_seqs:\n",
    "    e_seqs[i]=vectorizeSequence(seq.lower())\n",
    "    i += 1\n",
    "\n",
    "for x in range(nbr_sequences):\n",
    "    evolved_seqs[x] = np.empty((iterations*2,2), dtype=object)\n",
    "\n",
    "for gen in range(0, iterations*2):\n",
    "    for i in range(len(e_seqs)):\n",
    "        if gen < iterations:\n",
    "            # Evolve for lowest MRL\n",
    "            target_rl = 0\n",
    "            e_seqs[i] = negative_selection(seq=e_seqs[i], model=model, scaler=scaler, target_val=target_rl, no_uaug=no_uaug,\n",
    "                                    no_stop=no_stop, nbr_bases_to_mutate=nbr_bases_to_mutate, multi_mutate_prob=prob_of_multi_mutation, seq_len=seq_len)\n",
    "        else:\n",
    "            # Evolve to highest MRL - set target_rl to arbitrarily high value\n",
    "            target_rl = 20\n",
    "            e_seqs[i] = selection(seq=e_seqs[i], model=model, scaler=scaler, target_val=target_rl,no_uaug=no_uaug,\n",
    "                                    no_stop=no_stop, nbr_bases_to_mutate=nbr_bases_to_mutate, multi_mutate_prob=prob_of_multi_mutation, seq_len=seq_len)\n",
    "    \n",
    "    for x in range(nbr_sequences):\n",
    "        evolved_seqs[x][gen, 0] = vector_to_nuc(e_seqs[x])\n",
    "        evolved_seqs[x][gen, 1] = model.predict(e_seqs).reshape(-1)[x]\n",
    "    \n",
    "    if gen % 100 == 0:\n",
    "        print gen,\n",
    "\n",
    "for x in range(nbr_sequences):\n",
    "    evolved_seqs[x][:,1] = scaler.inverse_transform(evolved_seqs[x][:, 1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python2.7/dist-packages/matplotlib/font_manager.py:1320: UserWarning: findfont: Font family [u'sans-serif'] not found. Falling back to DejaVu Sans\n",
      "  (prop.get_family(), self.defaultFamily[fontext]))\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f110b8b4150>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for x in range(nbr_sequences)[:5]:\n",
    "    plt.plot(range(evolved_seqs[0].shape[0]), evolved_seqs[x][:,1])\n",
    "plt.xlabel('Generations')\n",
    "plt.ylabel('Predicted mean ribosome load')\n",
    "plt.gcf().set_size_inches((4,4))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Now get rid of steps where the sequence didn't change, make a dataframe and store in a dictionary."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "272\n"
     ]
    }
   ],
   "source": [
    "wb_seqs = {}\n",
    "count = 0\n",
    "for x in range(len(evolved_seqs)):\n",
    "    tmp = pd.DataFrame(evolved_seqs[x], columns=['seq', 'pred_rl'])\n",
    "    tmp['generation'] = tmp.index\n",
    "    tmp = tmp.drop_duplicates(subset=['seq'])\n",
    "    tmp.reset_index(inplace=True, drop=True)\n",
    "    wb_seqs[x] = tmp\n",
    "    count += len(tmp)\n",
    "print count"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "________________"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Evolving random to best"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python2.7/dist-packages/sklearn/preprocessing/data.py:586: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.\n",
      "  warnings.warn(DEPRECATION_MSG_1D, DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "StandardScaler(copy=True, with_mean=True, with_std=True)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nbr_sequences = 20\n",
    "rand_seqs = make_random_sequences(nbr_sequences, 54, 'ATGG', no_uaug=True, no_stop=True)\n",
    "test_sequences = np.empty([len(rand_seqs),54,4])\n",
    "\n",
    "i = 0\n",
    "for seq in rand_seqs:\n",
    "    test_sequences[i]=vectorizeSequence(seq.lower())\n",
    "    i += 1\n",
    "\n",
    "scaler = preprocessing.StandardScaler()\n",
    "scaler.fit(scale_utrs['rl'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n"
     ]
    }
   ],
   "source": [
    "# Dictionary where new sequences are saved\n",
    "evolved_seqs = {}\n",
    "# Number of evolution iterations\n",
    "iterations = 100\n",
    "# Number of bases to mutate if the probability to 'multi-mutate' is exceeded\n",
    "nbr_bases_to_mutate = 2\n",
    "# Probability to change multiple bases in an iteration\n",
    "prob_of_multi_mutation = 0.5\n",
    "# If using the original evolution model, set seq_len to 54. That model was\n",
    "# trained on UTRs that included the first for basees of the CDS (ATGG).\n",
    "seq_len = 50\n",
    "# Choose whether or not to allow uAUGs and / or stop codons\n",
    "no_uaug = True\n",
    "no_stop = False\n",
    "\n",
    "nbr_sequences = 5\n",
    "rand_seqs = make_random_sequences(nbr_sequences, seq_len, no_uaug=True, no_stop=True)\n",
    "e_seqs = np.empty([len(rand_seqs), seq_len, 4])\n",
    "\n",
    "i = 0\n",
    "for seq in rand_seqs:\n",
    "    e_seqs[i]=vectorizeSequence(seq.lower())\n",
    "    i += 1\n",
    "\n",
    "for x in range(nbr_sequences):\n",
    "    evolved_seqs[x] = np.empty((iterations,2), dtype=object)\n",
    "\n",
    "for gen in range(0, iterations):\n",
    "    for i in range(len(e_seqs)):\n",
    "        # Evolve to highest MRL - set target_rl to arbitrarily high value\n",
    "        target_rl = 20\n",
    "        e_seqs[i] = selection(seq=e_seqs[i], model=model, scaler=scaler, target_val=target_rl,no_uaug=no_uaug,\n",
    "                                no_stop=no_stop, nbr_bases_to_mutate=nbr_bases_to_mutate, multi_mutate_prob=prob_of_multi_mutation, seq_len=seq_len)\n",
    "    \n",
    "    for x in range(nbr_sequences):\n",
    "        evolved_seqs[x][gen, 0] = vector_to_nuc(e_seqs[x])\n",
    "        evolved_seqs[x][gen, 1] = model.predict(e_seqs).reshape(-1)[x]\n",
    "    \n",
    "    if gen % 100 == 0:\n",
    "        print gen,\n",
    "\n",
    "for x in range(nbr_sequences):\n",
    "    evolved_seqs[x][:,1] = scaler.inverse_transform(evolved_seqs[x][:, 1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nrkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f6766dba4d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for x in range(nbr_sequences)[:5]:\n",
    "    plt.plot(range(evolved_seqs[0].shape[0]), evolved_seqs[x][:,1])\n",
    "plt.xlabel('Generations')\n",
    "plt.ylabel('Predicted mean ribosome load')\n",
    "plt.gcf().set_size_inches((4,4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "119\n"
     ]
    }
   ],
   "source": [
    "rb_seqs = {}\n",
    "count = 0\n",
    "for x in range(len(evolved_seqs)):\n",
    "    tmp = pd.DataFrame(evolved_seqs[x], columns=['seq', 'pred_rl'])\n",
    "    tmp['generation'] = tmp.index\n",
    "    tmp = tmp.drop_duplicates(subset=['seq'])\n",
    "    tmp.reset_index(inplace=True, drop=True)\n",
    "    rb_seqs[x] = tmp\n",
    "    count += len(tmp)\n",
    "print count"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
